`include "PRV564Config.v"
`include "PRV564Define.v"
`timescale  1ns / 1ps
/*****************************************************************************************
 *    author : Jack's Team Xiaoyu HONG
 *    e-mail : 
 *    date   : 20210730
 *    desc   : PRV564 first version difftest framework
 *    version: 0000 (Orignal version)

**********************************************************************************************/
module SimTop(
  input         clock,
  input         reset,
  input  [63:0] io_logCtrl_log_begin,
  input  [63:0] io_logCtrl_log_end,
  input  [63:0] io_logCtrl_log_level,
  input         io_perfInfo_clean,
  input         io_perfInfo_dump,
  output        io_uart_out_valid,
  output [7:0]  io_uart_out_ch,
  output        io_uart_in_valid,
  input  [7:0]  io_uart_in_ch
  // ......
);/* verilator lint_off UNOPTFLAT */
/* verilator lint_off TIMESCALEMOD */
//-----------------Test bench global signal----------------------
    wire                 Kernel_CLKi;                                    //Kernel clock input
    wire                 Kernel_ARSTi;                                   //Kernel reset input (Async)
    reg                 INT_Mtimer=0,     INT_Stimer=0,     INT_Msoft=0;              //Timer and Software interrupt
    reg                 INT_Mext=0,       INT_Sext=0;                           //External interrupt
    reg                 INT_NMI=0;                                        //None Maskable interuupt
    reg [`XLEN-1:0]     Mtimer=0;
//-----------------Kernel Difftest Debug Information-------------------
    assign    Kernel_CLKi=clock;
    assign    Kernel_ARSTi=reset;

    
    wire                 ICache_AQ_V,      DCache_AQ_V;
    wire [7:0]           ICache_AQ_ID,     DCache_AQ_ID;
    wire [7:0]           ICache_AQ_CMD,    DCache_AQ_CMD;
    wire                 ICache_AQ_CI,     DCache_AQ_CI;
    wire                 ICache_AQ_WT,     DCache_AQ_WT;
    wire [15:0]          ICache_AQ_BSEL,   DCache_AQ_BSEL;
    wire [127:0]                           DCache_AQ_WDATA;
    wire [`XLEN-1:0]     ICache_AQ_ADDR,   DCache_AQ_ADDR;
    wire                  ICache_AQ_FULL,   DCache_AQ_FULL;
    wire                  ICache_RQ_V,      DCache_RQ_V;
    wire [7:0]            ICache_RQ_ID,     DCache_RQ_ID;
    wire                  ICache_RQ_WRERR,  DCache_RQ_WRERR;
    wire                  ICache_RQ_RDERR,  DCache_RQ_RDERR;
    wire                  ICache_RQ_RDY,    DCache_RQ_RDY;
    wire [127:0]          ICache_RQ_RDATA,  DCache_RQ_RDATA;
    wire                 ICache_RQ_ACK,    DCache_RQ_ACK;
    wire                ITLB_FIB_WRENo, DTLB_FIB_WRENo;        //write to DTLB_FIB enable
    wire                ITLB_FIB_REQo,  DTLB_FIB_REQo;       //request DTLB_FIB trans
    wire                ITLB_FIB_ACKi,  DTLB_FIB_ACKi;        //request acknowledge
    wire                ITLB_FIB_FULLi, DTLB_FIB_FULLi;       //DTLB_FIB FIFO full
    wire [7:0]          ITLB_FIB_IDo,   DTLB_FIB_IDo;
    wire [7:0]          ITLB_FIB_CMDo,  DTLB_FIB_CMDo;
    wire [3:0]          ITLB_FIB_BURSTo,DTLB_FIB_BURSTo;
    wire [3:0]          ITLB_FIB_SIZEo, DTLB_FIB_SIZEo;
    wire [`XLEN-1:0]    ITLB_FIB_ADDRo, DTLB_FIB_ADDRo;    
    wire [`XLEN-1:0]    ITLB_FIB_DATAo, DTLB_FIB_DATAo;
    wire [7:0]          ITLB_FIB_IDi,   DTLB_FIB_IDi;
    wire [7:0]          ITLB_FIB_RPLi,  DTLB_FIB_RPLi;
    wire                ITLB_FIB_Vi,    DTLB_FIB_Vi;
    wire [`XLEN-1:0]    ITLB_FIB_DATAi, DTLB_FIB_DATAi;

PRV564_Kernel               PRV564_Kernel(
    .Kernel_CLKi            (Kernel_CLKi),
    .Kernel_ARSTi           (Kernel_ARSTi),

//---------------Interrupt signal-------------------------
    .Kernel_NMIPLi(1'b0),      //Power lost!
    .Kernel_NMIEEi(1'b0),      //Ecc Error
    .Kernel_NMIGi(1'b0),       //General purpose
    .Kernel_MTIi             (INT_Mtimer),
    .Kernel_MSIi             (INT_Msoft),
    .Kernel_MEIi	         (INT_Mext),
    .Kernel_SEIi	         (INT_Sext),
//--------------YSYX210152_Machine mode timer-----------------------
    .Kernel_MTIMEi           (Mtimer),
//TLB interfaces

    .ITLB_FIBo_WREN(), .DTLB_FIBo_WREN(),        //write to DTLB_FIB enable
    .ITLB_FIBo_REQ(ITLB_FIB_REQo),  .DTLB_FIBo_REQ(DTLB_FIB_REQo),        //request DTLB_FIB trans
    .ITLB_FIBi_ACK(1'b1),  .DTLB_FIBi_ACK(1'b1),        //request acknowledge
    .ITLB_FIBi_FULL(ITLB_FIB_FULLi), .DTLB_FIBi_FULL(DTLB_FIB_FULLi),       //DTLB_FIB FIFO full
    .ITLB_FIBo_ID(ITLB_FIB_IDo),   .DTLB_FIBo_ID(DTLB_FIB_IDo),
    .ITLB_FIBo_CMD(ITLB_FIB_CMDo),  .DTLB_FIBo_CMD(DTLB_FIB_CMDo),
    .ITLB_FIBo_BURST(ITLB_FIB_BURSTo),.DTLB_FIBo_BURST(DTLB_FIB_BURSTo),
    .ITLB_FIBo_SIZE(ITLB_FIB_SIZEo), .DTLB_FIBo_SIZE(DTLB_FIB_SIZEo),
    .ITLB_FIBo_ADDR(ITLB_FIB_ADDRo), .DTLB_FIBo_ADDR(DTLB_FIB_ADDRo),    
    .ITLB_FIBo_DATA(ITLB_FIB_DATAo), .DTLB_FIBo_DATA(DTLB_FIB_DATAo),
    .ITLB_FIBi_ID(ITLB_FIB_IDi),   .DTLB_FIBi_ID(DTLB_FIB_IDi),
    .ITLB_FIBi_RPL(ITLB_FIB_RPLi),  .DTLB_FIBi_RPL(DTLB_FIB_RPLi),
    .ITLB_FIBi_V(ITLB_FIB_Vi),    .DTLB_FIBi_V(DTLB_FIB_Vi),
    .ITLB_FIBi_DATA(ITLB_FIB_DATAi), .DTLB_FIBi_DATA(DTLB_FIB_DATAi),

//Cache INterface


    .ICache_AQ_V(ICache_AQ_V),      
    .DCache_AQ_V(DCache_AQ_V),
    .ICache_AQ_ID(ICache_AQ_ID),     
    .DCache_AQ_ID(DCache_AQ_ID),
    .ICache_AQ_CMD(ICache_AQ_CMD),    
    .DCache_AQ_CMD(DCache_AQ_CMD),
    .ICache_AQ_CI(ICache_AQ_CI),     
    .DCache_AQ_CI(DCache_AQ_CI),
    .ICache_AQ_WT(ICache_AQ_WT),     
    .DCache_AQ_WT(DCache_AQ_WT),
    .ICache_AQ_BSEL(ICache_AQ_BSEL),   
    .DCache_AQ_BSEL(DCache_AQ_BSEL),
    .DCache_AQ_WDATA(DCache_AQ_WDATA),
    .ICache_AQ_ADDR(ICache_AQ_ADDR),   
    .DCache_AQ_ADDR(DCache_AQ_ADDR),
    .ICache_AQ_FULL(ICache_AQ_FULL),   
    .DCache_AQ_FULL(DCache_AQ_FULL),
    .ICache_RQ_V(ICache_RQ_V),  
    .DCache_RQ_V(DCache_RQ_V),
    .ICache_RQ_ID(ICache_RQ_ID),  
    .DCache_RQ_ID(DCache_RQ_ID),
    .ICache_RQ_WRERR(ICache_RQ_WRERR),  
    .DCache_RQ_WRERR(DCache_RQ_WRERR),
    .ICache_RQ_RDERR(ICache_RQ_RDERR),  
    .DCache_RQ_RDERR(DCache_RQ_RDERR),
    .ICache_RQ_RDY(ICache_RQ_RDY),  
    .DCache_RQ_RDY(DCache_RQ_RDY),
    .ICache_RQ_RDATA(ICache_RQ_RDATA),  
    .DCache_RQ_RDATA(DCache_RQ_RDATA),
    .ICache_RQ_ACK(ICache_RQ_ACK),  
    .DCache_RQ_ACK(DCache_RQ_ACK)

	
);

AQRQ_Difftest TestTCM
(
    .ICache_AQ_V(ICache_AQ_V),      
    .DCache_AQ_V(DCache_AQ_V),
    .ICache_AQ_ID(ICache_AQ_ID),     
    .DCache_AQ_ID(DCache_AQ_ID),
    .ICache_AQ_CMD(ICache_AQ_CMD),    
    .DCache_AQ_CMD(DCache_AQ_CMD),
    .ICache_AQ_CI(ICache_AQ_CI),     
    .DCache_AQ_CI(DCache_AQ_CI),
    .ICache_AQ_WT(ICache_AQ_WT),     
    .DCache_AQ_WT(DCache_AQ_WT),
    .ICache_AQ_BSEL(ICache_AQ_BSEL),   
    .DCache_AQ_BSEL(DCache_AQ_BSEL),
    .DCache_AQ_WDATA(DCache_AQ_WDATA),
    .ICache_AQ_ADDR(ICache_AQ_ADDR),   
    .DCache_AQ_ADDR(DCache_AQ_ADDR),
    .ICache_AQ_FULL(ICache_AQ_FULL),   
    .DCache_AQ_FULL(DCache_AQ_FULL),
    .ICache_RQ_V(ICache_RQ_V),  
    .DCache_RQ_V(DCache_RQ_V),
    .ICache_RQ_ID(ICache_RQ_ID),  
    .DCache_RQ_ID(DCache_RQ_ID),
    .ICache_RQ_WRERR(ICache_RQ_WRERR),  
    .DCache_RQ_WRERR(DCache_RQ_WRERR),
    .ICache_RQ_RDERR(ICache_RQ_RDERR),  
    .DCache_RQ_RDERR(DCache_RQ_RDERR),
    .ICache_RQ_RDY(ICache_RQ_RDY),  
    .DCache_RQ_RDY(DCache_RQ_RDY),
    .ICache_RQ_RDATA(ICache_RQ_RDATA),  
    .DCache_RQ_RDATA(DCache_RQ_RDATA),
    .ICache_RQ_ACK(ICache_RQ_ACK),  
    .DCache_RQ_ACK(DCache_RQ_ACK),  
    .GLBi_CLK(clock)
);

FIB_Difftest ITLB_FIB(
    // global input
    .VFIBi_CLK(clock),
    .VFIBi_ARST(reset),
    // master request
    .VFIBi_WREN(ITLB_FIB_REQo),
    .VFIBi_ID(ITLB_FIB_IDo),
    .VFIBi_CMD(ITLB_FIB_CMDo),
    .VFIBi_BURST(ITLB_FIB_BURSTo),
    .VFIBi_SIZE(ITLB_FIB_SIZEo),
    .VFIBi_ADDR(ITLB_FIB_ADDRo),
    .VFIBi_DATA(ITLB_FIB_DATAo),
    .VFIBo_FULL(ITLB_FIB_FULLi),
    .VFIBo_V(ITLB_FIB_Vi),
    .VFIBo_ID(ITLB_FIB_IDi),
    .VFIBo_RPL(ITLB_FIB_RPLi),
    .VFIBo_DATA(ITLB_FIB_DATAi)
);

FIB_Difftest DTLB_FIB(
    // global input
    .VFIBi_CLK(clock),
    .VFIBi_ARST(reset),
    // master request
    .VFIBi_WREN(DTLB_FIB_REQo),
    .VFIBi_ID(DTLB_FIB_IDo),
    .VFIBi_CMD(DTLB_FIB_CMDo),
    .VFIBi_BURST(DTLB_FIB_BURSTo),
    .VFIBi_SIZE(DTLB_FIB_SIZEo),
    .VFIBi_ADDR(DTLB_FIB_ADDRo),
    .VFIBi_DATA(DTLB_FIB_DATAo),
    .VFIBo_FULL(DTLB_FIB_FULLi),
    .VFIBo_V(DTLB_FIB_Vi),
    .VFIBo_ID(DTLB_FIB_IDi),
    .VFIBo_RPL(DTLB_FIB_RPLi),
    .VFIBo_DATA(DTLB_FIB_DATAi)
);
endmodule
